import observe from './observer/index.js'

export default function initMixin(Vue) {
  // _init 进行选项初始化
  Vue.prototype._init = function (options) {
    const vm = this
    // 可以通过实例访问当选项
    vm.$options = options
    initState(vm)
  }
}

function initState(vm) {
  // 真正初始化选项
  const options = vm.$options
  if (options.data) {
    initData(vm)
  }
}

// 进行数据代理, 当用户访问vm上的数据,返回
function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      console.log('劫持到了vm访问的数据')
      return vm[source][key]
    },
    set(val) {
      vm[source][key] = val
    },
  })
}

function initData(vm) {
  // console.log('初始化data数据', vm)
  let data = vm.$options.data

  data = vm._data = typeof data === 'function' ? data.call(vm) : data
  // data 选项数据
  // data进行数据劫持
  for (let key in vm._data) {
    proxy(vm, '_data', key)
  }

  observe(data)
}
